<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="format-detection" content="telephone=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="icon" href="/images/icons/favicon-16x16.png?v=2.6.2" type="image/png" sizes="16x16"><link rel="icon" href="/images/icons/favicon-32x32.png?v=2.6.2" type="image/png" sizes="32x32"><meta name="description" content="本篇文章是对课程软件工程经济学的课堂内容总结，适用于大连交通大学。第一章：绪论">
<meta property="og:type" content="article">
<meta property="og:title" content="软件工程经济学第一章">
<meta property="og:url" content="https://kohler19.gitee.io/2022/03/15/Software-engineering-economics1/index.html">
<meta property="og:site_name" content="愷龍的网络日志">
<meta property="og:description" content="本篇文章是对课程软件工程经济学的课堂内容总结，适用于大连交通大学。第一章：绪论">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://pic.imgdb.cn/item/62302fa15baa1a80ab40ac5c.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62302fe05baa1a80ab40c960.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623032505baa1a80ab426c24.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623032ca5baa1a80ab42b006.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623032ea5baa1a80ab42be2e.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623047565baa1a80ab533f47.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623047a25baa1a80ab53c61b.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623048005baa1a80ab5449ca.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/6230482a5baa1a80ab545f81.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623048775baa1a80ab54888a.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623048e75baa1a80ab54b4f0.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/6230494f5baa1a80ab54ed0e.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623049cf5baa1a80ab5542cf.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623049cf5baa1a80ab5542cf.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304a3e5baa1a80ab557231.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304a555baa1a80ab557c5a.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304a7e5baa1a80ab558d97.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304af25baa1a80ab55cc21.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304b695baa1a80ab55fd52.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304b7c5baa1a80ab560249.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304bac5baa1a80ab561145.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304c345baa1a80ab564d6b.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/62304c655baa1a80ab565f81.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623071ae5baa1a80ab69fb83.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/6230720b5baa1a80ab6a5ba0.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623072595baa1a80ab6a7a41.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623072925baa1a80ab6a92fe.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623072cd5baa1a80ab6aabee.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/623072fd5baa1a80ab6abdff.jpg">
<meta property="og:image" content="https://pic.imgdb.cn/item/6230732e5baa1a80ab6ad253.jpg">
<meta property="og:image" content="https://s4.ax1x.com/2022/01/03/Tb8ZB4.png">
<meta property="article:published_time" content="2022-03-15T11:13:53.000Z">
<meta property="article:modified_time" content="2022-03-15T11:18:22.127Z">
<meta property="article:author" content="李恺龙">
<meta property="article:tag" content="软件工程经济学">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://pic.imgdb.cn/item/62302fa15baa1a80ab40ac5c.jpg"><title>软件工程经济学第一章 | 愷龍的网络日志</title><link ref="canonical" href="https://kohler19.gitee.io/2022/03/15/Software-engineering-economics1/"><link rel="dns-prefetch" href="https://cdn.jsdelivr.net"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.12.1/css/all.min.css" type="text/css"><link rel="stylesheet" href="/css/index.css?v=2.6.2"><script>var Stun = window.Stun || {};
var CONFIG = {
  root: '/',
  algolia: undefined,
  assistSearch: undefined,
  fontIcon: {"prompt":{"success":"fas fa-check-circle","info":"fas fa-arrow-circle-right","warning":"fas fa-exclamation-circle","error":"fas fa-times-circle"},"copyBtn":"fas fa-copy"},
  sidebar: {"offsetTop":"20px","tocMaxDepth":6},
  header: {"enable":true,"showOnPost":true,"scrollDownIcon":false},
  postWidget: {"endText":true},
  nightMode: {"enable":true},
  back2top: {"enable":true},
  codeblock: {"style":"default","highlight":"light","wordWrap":false},
  reward: false,
  fancybox: false,
  zoomImage: {"gapAside":"20px"},
  galleryWaterfall: undefined,
  lazyload: false,
  pjax: undefined,
  externalLink: {"icon":{"enable":true,"name":"fas fa-external-link-alt"}},
  shortcuts: undefined,
  prompt: {"copyButton":"复制","copySuccess":"复制成功","copyError":"复制失败"},
  sourcePath: {"js":"js","css":"css","images":"images"},
};

window.CONFIG = CONFIG;</script><meta name="generator" content="Hexo 5.4.0"></head><body><div class="container" id="container"><header class="header" id="header"><div class="header-inner"><nav class="header-nav header-nav--fixed"><div class="header-nav-inner"><div class="header-nav-menubtn"><i class="fas fa-bars"></i></div><div class="header-nav-menu"><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/"><span class="header-nav-menu-item__icon"><i class="fas fa-home"></i></span><span class="header-nav-menu-item__text">首页</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/archives/"><span class="header-nav-menu-item__icon"><i class="fas fa-folder-open"></i></span><span class="header-nav-menu-item__text">归档</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/分类/"><span class="header-nav-menu-item__icon"><i class="fas fa-layer-group"></i></span><span class="header-nav-menu-item__text">分类</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/标签/"><span class="header-nav-menu-item__icon"><i class="fas fa-tags"></i></span><span class="header-nav-menu-item__text">标签</span></a></div><div class="header-nav-menu-item"><a class="header-nav-menu-item__link" href="/categories/Book/"><span class="header-nav-menu-item__icon"><i class="fas fa-book"></i></span><span class="header-nav-menu-item__text">书籍</span></a></div></div><div class="header-nav-search"><span class="header-nav-search__icon"><i class="fas fa-search"></i></span><span class="header-nav-search__text">搜索</span></div><div class="header-nav-mode"><div class="mode"><div class="mode-track"><span class="mode-track-moon"></span><span class="mode-track-sun"></span></div><div class="mode-thumb"></div></div></div></div></nav><div class="header-banner"><div class="header-banner-info"><div class="header-banner-info__title">愷龍的网络日志</div><div class="header-banner-info__subtitle">每天多学一点，以后就少敲一点代码</div></div></div></div></header><main class="main" id="main"><div class="main-inner"><div class="content-wrap" id="content-wrap"><div class="content" id="content"><!-- Just used to judge whether it is an article page--><div id="is-post"></div><div class="post"><header class="post-header"><h1 class="post-title">软件工程经济学第一章</h1><div class="post-meta"><span class="post-meta-item post-meta-item--createtime"><span class="post-meta-item__icon"><i class="far fa-calendar-plus"></i></span><span class="post-meta-item__info">发表于</span><span class="post-meta-item__value">2022-03-15</span></span><span class="post-meta-item post-meta-item--updatetime"><span class="post-meta-item__icon"><i class="far fa-calendar-check"></i></span><span class="post-meta-item__info">更新于</span><span class="post-meta-item__value">2022-03-15</span></span></div></header><div class="post-body"><p>本篇文章是对课程<code>软件工程经济学</code>的课堂内容总结，适用于大连交通大学。<br>第一章：绪论</p>
<span id="more"></span>


        <h1 id="软件、软件产业与软件企业"   >
          <a href="#软件、软件产业与软件企业" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件、软件产业与软件企业" class="headerlink" title="软件、软件产业与软件企业"></a>软件、软件产业与软件企业</h1>
      <p>软件的定义：软件是计算机系统中与硬件相互依存的另一个部分，它包括程序、数据及其相关文档的完整集合。  </p>

        <h2 id="软件分类及其特点——软件的分类"   >
          <a href="#软件分类及其特点——软件的分类" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件分类及其特点——软件的分类" class="headerlink" title="软件分类及其特点——软件的分类"></a>软件分类及其特点——软件的分类</h2>
      <p>-按软件的功能进行分类：系统软件、支撑软件、应用软件<br>-按软件工作方式进行分类：实时处理软件、多用户分时软件、交互式软件、批处理软件<br>-按软件权益进行分类：商品软件、共享软件、自由软件<br>-按软件的标准化程度进行分类：标准化软件、半定制软件、定制软件<br>-按软件与硬件关联程度进行分类：嵌入型软件、组织型软件、半独立型软件<br>-按照软件所处的层次进行分类：平台软件、中间软件、应用软件  </p>
<p>①  软件是信息产品，具有无形性、抽象性、可复制性和共享性。<br>②  软件的生产过程几乎都是从零开始。<br>③  软件的价值以及成本构成和传统工业产品不同，如没有库存成本。<br>④  软件开发和运行常常受不同的计算机软件和硬件平台的限制，对计算机软件和硬件系统有不同程度的依赖性。<br>⑤  软件开发过程的复杂性。<br>⑥  软件开发是一项创造性活动。<br>⑦  软件开发需要大量的资金投入。<br>⑧  软件产品对用户有黏性。<br>⑨  软件产品的更新速度快。 </p>

        <h2 id="软件产业"   >
          <a href="#软件产业" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件产业" class="headerlink" title="软件产业"></a>软件产业</h2>
      <ul>
<li>1996年的《计算机软件产业技术创新战略研究》报告中对软件产业的定义：软件产业是指为有效地利用计算机资源而从事计算机程序编制、信息系统开发和集成及从事相关服务的产业。 </li>
<li>《2000年中国软件产业研究报告》中指出软件产业和软件市场包括软件产品与软件服务两大部分。</li>
<li>麦肯锡公司出版发行的《软件业的成功奥秘》中，将软件业分为专业化服务和软件产品。</li>
<li>国际数据公司在做市场研究时，将软件产业细分为应用解决方案、应用开发和配置软件和系统基础软件三大领域。</li>
<li>印度将IT软件服务产业分为产品和技术开发业（Product &amp; Technology）、IT服务业（IT Services）和IT关联服务业（IT Enabled Services）。  </li>
</ul>

        <h3 id="软件产业——软件产业的特点"   >
          <a href="#软件产业——软件产业的特点" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件产业——软件产业的特点" class="headerlink" title="软件产业——软件产业的特点"></a>软件产业——软件产业的特点</h3>
      <ul>
<li>高技术、高附加值及高效益特征    </li>
<li>国际化特征  </li>
<li>服务化特征  </li>
<li>软件产业的专业化分工越来越细  </li>
<li>高关联度特征    </li>
</ul>

        <h3 id="软件产业——软件产业的发展模式"   >
          <a href="#软件产业——软件产业的发展模式" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件产业——软件产业的发展模式" class="headerlink" title="软件产业——软件产业的发展模式"></a>软件产业——软件产业的发展模式</h3>
      <ul>
<li>美国的“全面领先模式”  </li>
<li>日本和韩国的“整机带动模式”  </li>
<li>爱尔兰的“软件集散模式”  </li>
<li>印度的“外包服务模式”  </li>
</ul>
<p><img src="https://pic.imgdb.cn/item/62302fa15baa1a80ab40ac5c.jpg"></p>

        <h3 id="软件企业"   >
          <a href="#软件企业" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件企业" class="headerlink" title="软件企业"></a>软件企业</h3>
      <p>1、软件企业的组织结构 </p>
<ul>
<li>直线职能式组织结构 </li>
</ul>
<p><img src="https://pic.imgdb.cn/item/62302fe05baa1a80ab40c960.jpg"></p>
<ul>
<li>矩阵式组织结构  </li>
</ul>
<p><img src="https://pic.imgdb.cn/item/623032505baa1a80ab426c24.jpg"></p>
<ul>
<li>事业部制组织结构</li>
</ul>
<center>
<img src="https://pic.imgdb.cn/item/623032ca5baa1a80ab42b006.jpg">
</center>

<ul>
<li>网络式组织结构</li>
</ul>
<center>
<img src="https://pic.imgdb.cn/item/623032ea5baa1a80ab42be2e.jpg">
</center>

<p>2、软件企业的管理<br>       软件企业管理主要包括战略管理、市场管理、项目管理、质量管理、采购管理、人力资源管理、知识管理、成本管理、风险管理和软件企业文化管理等等。</p>
<blockquote>
<p>在IT行业，软件企业开展项目的目的一般是完成某一项软件产品或者服务，就会引入信息项目管理的程序来执行相关任务。   </p>
</blockquote>
<blockquote>
<p>项目管理知识体系（Project Management Body of Knowledge，PMBOK）是由美国项目管理学会（PMI）在20世纪70年代率先提出的，按照ISO更新要求，经过多次严格的修订，于2018年第1季度正式启用第6版，确定为十大知识领域，主要包括项目整合管理、项目范围管理、项目进度管理、项目成本管理、项目质量管理、项目资源管理、项目沟通管理、项目风险管理、项目采购管理以及项目相关方（干系人）管理。  </p>
</blockquote>

        <h1 id="软件工程"   >
          <a href="#软件工程" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件工程" class="headerlink" title="软件工程"></a>软件工程</h1>
      
        <h3 id="软件工程的定义及其过程"   >
          <a href="#软件工程的定义及其过程" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件工程的定义及其过程" class="headerlink" title="软件工程的定义及其过程"></a>软件工程的定义及其过程</h3>
      <ul>
<li>20世纪90年代，美国电气与电子工程师学会给出软件工程的定义是：<blockquote>
<p>（1）将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护；<br>（2）对（1）中所述方法的研究。 </p>
</blockquote>
</li>
<li>软件工程可以说是一种层次化的技术</li>
</ul>
<center>
<img src="https://pic.imgdb.cn/item/623047565baa1a80ab533f47.jpg">
</center>


        <h3 id="软件开发模型"   >
          <a href="#软件开发模型" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件开发模型" class="headerlink" title="软件开发模型"></a>软件开发模型</h3>
      <p>1.瀑布模型是20世纪70年代由W.Royce提出的，是一种线性开发模型，有不可回溯特性。它给出了软件生存周期相关活动的固定顺序，开发人员必须遵循完成上一阶段的工作任务后，方可进行下一阶段工作的原则，且往往上一阶段的输出就是下一阶段的输入。如果在软件开发后期发现前期的某一个问题，则需要付出较高的代价   </p>
 <center>
<img src="https://pic.imgdb.cn/item/623047a25baa1a80ab53c61b.jpg">
</center>

<p>2.V模型是瀑布模型的一个升级变体，该模型描述了在保证质量与沟通、建模等动作之间的关系。强调了一种将验证和确认动作应用在早期软件工程中的直观方法。</p>
 <center>
<img src="https://pic.imgdb.cn/item/623048005baa1a80ab5449ca.jpg">
</center>

<p>3.增量模型主要综合了线性过程流与并行过程流的特征，该模型在每个阶段都使用线性序列，每个线性序列都生产出软件的可交付增量。</p>
<center>
<img src="https://pic.imgdb.cn/item/6230482a5baa1a80ab545f81.jpg">
</center>

<p>4.原型模型，一般开始于沟通，在客户定义了相关软件的一些基本任务时，并没详细的定义功能和特性需求，或者开发人员可能对算法的效率、人机交互的模式没有较大把握的时候采用的一种模型，多用于给客户演示软件的开发效果。</p>
<center>
<img src="https://pic.imgdb.cn/item/623048775baa1a80ab54888a.jpg">
</center>

<p>5.螺旋模型，沿着螺线自内向外进行旋转，在直角坐标系的四个象限分别表示制定计划、评估方案，风险识别、工程实施和评价成果共4个方面的任务。该模型表示每旋转一圈该软件则开发出一个更为完善的新版本，逐步向外延伸，直到最终将得到客户所期望的系统。</p>
<center>
<img src="https://pic.imgdb.cn/item/623048e75baa1a80ab54b4f0.jpg">
</center>


        <h3 id="软件规模度量"   >
          <a href="#软件规模度量" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件规模度量" class="headerlink" title="软件规模度量"></a>软件规模度量</h3>
      <p>1.代码行度量  </p>
<p>软件规模常用程序的代码行（Line of code，LOC）或者千行代码KLOC（1000LOC）来衡量。代码行技术是一种较为简单的定量估算软件规模的方法，该方法依据以往开发类似产品的经验以及历史数据来估计实现一个功能所需要的源程序行数（不包括注释）。  </p>
<p>为了使程序规模的估算更加接近实际值，可以由多名比较有经验的软件工程师来做出估算。每个人都估计程序的最小规模“a”，最大规模“b”以及最可能的规模“m”，然后分别算出这3重规模的平均值a、b和m后，再用公式1.1计算程序规模的估算值。   </p>
  <center>
<img src="https://pic.imgdb.cn/item/6230494f5baa1a80ab54ed0e.jpg">
</center>

<p>2.功能点度量</p>
<ul>
<li><p> Albrecht于1979年首次提出面向功能的度量方法，主要考虑了软件系统的功能性和实用性，称之为功能点（Function point ,FP）的度量，功能点的度量主要是基于信息域的特征以及软件复杂性进行计算。  </p>
</li>
<li><p>用于功能点度量的5个基本信息域：用户输入数、用户输出数、用户查询数、文件数以及外部接口数。</p>
</li>
</ul>
 <center>
<img src="https://pic.imgdb.cn/item/623049cf5baa1a80ab5542cf.jpg">
</center>

 <center>
<img src="https://pic.imgdb.cn/item/623049cf5baa1a80ab5542cf.jpg">
</center>

 <center>
<img src="https://pic.imgdb.cn/item/62304a3e5baa1a80ab557231.jpg">
</center>

 <center>
<img src="https://pic.imgdb.cn/item/62304a555baa1a80ab557c5a.jpg">
</center>

 <center>
<img src="https://pic.imgdb.cn/item/62304a7e5baa1a80ab558d97.jpg">
</center>

<center>
<font face="楷体">环境复杂性因子取值表</font>
</center>

 <center>
<img src="https://pic.imgdb.cn/item/62304af25baa1a80ab55cc21.jpg">
</center>

<center>
<font face="楷体">复杂度取值表</font>
</center>

<p>环境复杂性因子Fi（i=1<del>14）是基于环境复杂性因子取值表对14个问题的评估所得到的值，对每个问题的取值范围是0</del>5，详见复杂度取值表，环境复杂性因子计算公式详见公式1.3。  </p>
<p>公式1.3、1.4:  </p>
 <center>
<img src="https://pic.imgdb.cn/item/62304b695baa1a80ab55fd52.jpg">
</center>

 <center>
<img src="https://pic.imgdb.cn/item/62304b7c5baa1a80ab560249.jpg">
</center>

<p>【例1.1】某软件企业根据客户需求对预定软件进行功能点度量，5个基本信息域的特征值dj按照表1.4所示的顺序分别为35，58，20，6，2；其对应的加权因子分别为：中间、中间、中间、中间和简单；对照表1.5和表1.6各项指标得到Fi的加权和为20，试计算其功能点。<br> <center><br><img src="https://pic.imgdb.cn/item/62304bac5baa1a80ab561145.jpg"></p>
</center>

<p>某软件根据需求分析，得到环境复杂性因子为18， 五个信息量的数值dj及其对应权系数aj的取值见表1，求软件系统的需求功能点为多少？  </p>
<p>dj和aj取值表:<br> <center><br><img src="https://pic.imgdb.cn/item/62304c345baa1a80ab564d6b.jpg"></p>
</center>

 <center>
<img src="https://pic.imgdb.cn/item/62304c655baa1a80ab565f81.jpg">
</center>


        <h3 id="程序复杂性度量"   >
          <a href="#程序复杂性度量" class="heading-link"><i class="fas fa-link"></i></a><a href="#程序复杂性度量" class="headerlink" title="程序复杂性度量"></a>程序复杂性度量</h3>
      <p>一般开发规模相同，复杂性却不同的程序，所花费的时间以及成本会有较大差异。K. Magel从六个方面来描述程序的复杂性：</p>
<ul>
<li>程序理解的难度</li>
<li>纠错、维护程序的难度</li>
<li>向他人解释程序的难度</li>
<li>按指定方法修改程序的难度</li>
<li>根据设计文件编写程序的工作量程度</li>
<li>执行程序时需要资源量的程度  </li>
</ul>
<p>程序的复杂性度量模型一般应遵循的基本原则: </p>
<blockquote>
<p>程序的复杂性与程序大小的关系不是线性的<br>控制结构复杂的程序比较复杂<br>数据结构复杂的程序比较复杂<br>转向语句使用不恰当的程序比较复杂<br>循环结构比选择结构较复杂，选择结构则比顺序结构较复杂<br>语句、数据、子程序以及模块在程序中的次序对复杂性有影响<br>全局变量、非局部变量较多时的程序比较复杂<br>参数按照地址调用比按值调用较复杂<br>函数的隐式副作用比显示参数传递较为难以理解<br>具有不同作用的变量共用一个名字时比较难理解<br>模块间、子程序间联系密切的程序较为复杂<br>嵌套深度越深的程序越复杂   </p>
</blockquote>
<p>1.McCabe环形复杂性度量<br>      McCabe环形复杂性度量方法是基于图论，对于一个强连通的有向图G，若用e表示弧数，n表示结点数，p表示强连通分量的个数。   </p>
 <center>
<img src="https://pic.imgdb.cn/item/623071ae5baa1a80ab69fb83.jpg">
</center>

<p>对于一个单入口及单出口的程序来说，从入口的结点都能到达图中的任意结点，同理从任一结点都可以到达出口结点，故程序图都是连通的。但经常不是强连通的，故在程序图中增加一条从出口结点到入口结点的弧来将程序图变成强连通的。对于单入口与单出口的程序，其连通分量就只有一个，即p=1。<br>      如图 (a)为例，当人为增加了出口结点至入口结点的弧则成为图(b) ，其e=8，n=6，p=1，由公式1.5可得V(G)=8-6+1=3，在图 (b)也能比较明显的见到3个环。  </p>
 <center>
<img src="https://pic.imgdb.cn/item/6230720b5baa1a80ab6a5ba0.jpg">
</center>
        一般为了简化环形的复杂性计算，通常用以下公式对图 (a)进行计算，  
                V(G)=e-n+2。  
  
<p>将图 (a)中的e=7，n=6带入公式1.6可得V（G）=7-6+2=3。可见环的个数等于程序图中区域的个数，如图 (a)中就有3个区域，分别是R1，R2和R3。   </p>
<p>2.Halstead复杂性度量<br>Halstead提出通过定量的公式计算方法来度量软件的复杂性。<br>       用n1表示程序中不同操作符的个数；n2表示程序中不同操作数的个数；N1表示程序中操作符的总数，N2表示程序中操作数的总数，则可用公式1.7表示程序的符号长度；用公式1.8表示程序的词汇量；用公式1.9表示程序量（即存储容量），即长度方程。   </p>
 <center>
<img src="https://pic.imgdb.cn/item/623072595baa1a80ab6a7a41.jpg">
</center>

<p> 一般认为最小的程序只有两个操作符，即函数调用与赋值，即n1=N1=2，操作数n_2^∗则是指赋予函数值的变量以及函数调用时的参数，即n_2^∗=n_2=N_2。带入公式1.9可得公式1.10所示的最小程序量计算公式，预测程序长度详见公式1.11，预测程序潜在的错误数详见公式1.12。   </p>
 <center>
<img src="https://pic.imgdb.cn/item/623072925baa1a80ab6a92fe.jpg">
</center>
 <center>
<img src="https://pic.imgdb.cn/item/623072cd5baa1a80ab6aabee.jpg">
</center>


        <h3 id="软件可靠性度量"   >
          <a href="#软件可靠性度量" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件可靠性度量" class="headerlink" title="软件可靠性度量"></a>软件可靠性度量</h3>
      <p>软件的可靠性是指在规定的时间内以及条件下，软件按照规格说明要求不会引起系统失效的概率。软件的可靠性是关系到系统成败的重要因素。软件可靠性计算公式为：<br> <center><br><img src="https://pic.imgdb.cn/item/623072fd5baa1a80ab6abdff.jpg"></p>
</center>

<p>其中，MTBF是指平均故障间隔时间，MTTF是指平均故障时间，而MTTR则是指平均修复时间。    </p>
<p> 软件的可用性是指软件在投入使用时能实现其事先指定的相关系统功能的概率，可用公式1.14来计算<br> <center><br><img src="https://pic.imgdb.cn/item/6230732e5baa1a80ab6ad253.jpg"></p>
</center>


        <h1 id="软件工程经济学简介"   >
          <a href="#软件工程经济学简介" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件工程经济学简介" class="headerlink" title="软件工程经济学简介"></a>软件工程经济学简介</h1>
      
        <h2 id="软件工程经济学简介-1"   >
          <a href="#软件工程经济学简介-1" class="heading-link"><i class="fas fa-link"></i></a><a href="#软件工程经济学简介-1" class="headerlink" title="软件工程经济学简介"></a>软件工程经济学简介</h2>
      <p>经济学是研究人类在生产、消费、分配、交换等经济活动过程中的资源配置与资源利用的学科，属于社会科学。  </p>
<p>工程经济学是研究如何根据既定的活动目标，分析活动的代价及其对目标实现的贡献，并在此基础上进行设计、评价和选择，以最低的代价来可靠的实现目标的最佳活动方案的一门学科。  </p>
<p>1.软件工程经济学的内涵与任务<br>       软件工程经济学（Software Engineering Economics，SEE）是属于软件工程学和工程经济学之间的交叉学科。我们将其定义为以软件工程领域中的经济问题和经济规律为主的一门经济学分支学科。是研究为实现特定功能需求的软件工程项目而提出的一门系统方法学科。<br>软件工程经济学主要包括以下四部分的内容： </p>
<ul>
<li>学科研究的对象、任务、特征、研究范围与研究方法；</li>
<li>软件系统内部构成要素与经济活动及其关联分析，如投资、融资、工期、成本、效益、效率、质量保证、开发、管理、运行与维护等及其关联分析；</li>
<li>软件系统的组织结构、管理决策以及与经营活动的关系；</li>
<li>软件系统的资金流、物流、信息流的输入和输出以及对系统外部（如国家、地区、社会、经济等）的影响。</li>
</ul>
<p>2.软件工程经济学的研究特点与方法体系   </p>
<ul>
<li><p>软件工程经济学的研究特点</p>
<blockquote>
<p>软件工程经济学研究的重点始终环绕着软件产品的质量、成本/效益、项目进度、效率等目标要素的关联分析，以及人的组织与协调管理。<br>软件工程经济学的研究思想主要来自于系统工程，因此软件系统目标的整体性、要素的层次性与关联性、系统环境的适应性等始终是人们研究的指导准则。<br>软件工程经济学采用定量与定性分析相结合、理论与实证验证相结合的方式进行研究。<br>考虑到我国与西方发达国家在文化与价值观念、技术水平、经营机制、管理水平与生产效率以及软件工程环境上的差异，因此在大力学习与借鉴西方发达国家有关软件工程经济学的理论、方法与应用成果的同时要注意环境的差异性对数量分析的影响，从而可在数学分析的思路与方法的通用性基础上来寻找适合于我国国情的研究结果。   </p>
</blockquote>
</li>
<li><p>软件工程经济学的方法体系</p>
<blockquote>
<p>管理学、社会学等；<br>经济学，主要包括微观经济学、宏观经济学、工程经济学、管理经济学、信息经济学等；<br>软件工程学，主要包括软件工程技术学、软件工程管理学；<br>计算机通信网络与信息系统；<br>系统工程与运筹学、应用统计学、模糊数学、系统动力学等。   </p>
</blockquote>
</li>
<li><p>软件工程经济学的研究与发展   </p>
</li>
</ul>
<p>国外研究:   </p>
<blockquote>
<p>软件工程诞生于“软件危机”。软件危机是指在计算机软件开发中的一系列问题。<br>软件工程经济学的研究最早始于美、英等国家，其中较有影响的有Boehm B.W、Putnam L.H以及Banard.L等专家。   </p>
</blockquote>
<ul>
<li>国内研究   <blockquote>
<p>我国软件工程经济学的研究还处于初级发展阶段，1990年和1991年由机械工业出版社相继出版了Boehm的著作《软件工程经济学》和Londeix.B的著作《软件开发成本估算》，对软件工程经济学的概念、方法宣传起到了一定的作用。西安电子科技大学的赵玮教授于2008年出版了《软件工程经济学》，对我国软件工程经济学的发展起到了指引作用。</p>
</blockquote>
</li>
</ul>
<center>如果您有什么问题或建议可以在下方的评论区评论，我会及时回复的。</center>
<center><font color="red">欢迎关注我的公众号，共同学习，共同提升！</font></center>
<center><font color="red">您可以通过公众号向我留言，也可以通过邮箱（lklong@88.com）联系我</font></center>
<center>
    <img src="https://s4.ax1x.com/2022/01/03/Tb8ZB4.png">
</center>





    




</div><footer class="post-footer"><div class="post-ending ending"><div class="ending__text">------ 本文结束，感谢您的阅读 ------</div></div><div class="post-copyright copyright"><div class="copyright-author"><span class="copyright-author__name">本文作者: </span><span class="copyright-author__value"><a href="https://kohler19.gitee.io">李恺龙</a></span></div><div class="copyright-link"><span class="copyright-link__name">本文链接: </span><span class="copyright-link__value"><a href="https://kohler19.gitee.io/2022/03/15/Software-engineering-economics1/">https://kohler19.gitee.io/2022/03/15/Software-engineering-economics1/</a></span></div><div class="copyright-notice"><span class="copyright-notice__name">版权声明: </span><span class="copyright-notice__value">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en" rel="external nofollow" target="_blank">BY-NC-SA</a> 许可协议。转载请注明出处！</span></div></div><div class="post-tags"><span class="post-tags-item"><span class="post-tags-item__icon"><i class="fas fa-tag"></i></span><a class="post-tags-item__link" href="https://kohler19.gitee.io/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E7%BB%8F%E6%B5%8E%E5%AD%A6/">软件工程经济学</a></span></div><nav class="post-paginator paginator"><div class="paginator-prev"><a class="paginator-prev__link" href="/2022/03/16/cloud-computing/"><span class="paginator-prev__icon"><i class="fas fa-angle-left"></i></span><span class="paginator-prev__text">云计算-概念、技术与架构 PDF</span></a></div><div class="paginator-next"><a class="paginator-next__link" href="/2022/03/14/cloud-computing1/"><span class="paginator-prev__text">云计算第三章</span><span class="paginator-next__icon"><i class="fas fa-angle-right"></i></span></a></div></nav></footer></div></div><div class="comments" id="comments"><div id="valine-container"></div></div></div><div class="sidebar-wrap" id="sidebar-wrap"><aside class="sidebar" id="sidebar"><div class="sidebar-nav"><span class="sidebar-nav-toc current">文章目录</span><span class="sidebar-nav-ov">站点概览</span></div><section class="sidebar-toc"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E3%80%81%E8%BD%AF%E4%BB%B6%E4%BA%A7%E4%B8%9A%E4%B8%8E%E8%BD%AF%E4%BB%B6%E4%BC%81%E4%B8%9A"><span class="toc-number">1.</span> <span class="toc-text">
          软件、软件产业与软件企业</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E5%88%86%E7%B1%BB%E5%8F%8A%E5%85%B6%E7%89%B9%E7%82%B9%E2%80%94%E2%80%94%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%88%86%E7%B1%BB"><span class="toc-number">1.1.</span> <span class="toc-text">
          软件分类及其特点——软件的分类</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E4%BA%A7%E4%B8%9A"><span class="toc-number">1.2.</span> <span class="toc-text">
          软件产业</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E4%BA%A7%E4%B8%9A%E2%80%94%E2%80%94%E8%BD%AF%E4%BB%B6%E4%BA%A7%E4%B8%9A%E7%9A%84%E7%89%B9%E7%82%B9"><span class="toc-number">1.2.1.</span> <span class="toc-text">
          软件产业——软件产业的特点</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E4%BA%A7%E4%B8%9A%E2%80%94%E2%80%94%E8%BD%AF%E4%BB%B6%E4%BA%A7%E4%B8%9A%E7%9A%84%E5%8F%91%E5%B1%95%E6%A8%A1%E5%BC%8F"><span class="toc-number">1.2.2.</span> <span class="toc-text">
          软件产业——软件产业的发展模式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E4%BC%81%E4%B8%9A"><span class="toc-number">1.2.3.</span> <span class="toc-text">
          软件企业</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B"><span class="toc-number">2.</span> <span class="toc-text">
          软件工程</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E7%9A%84%E5%AE%9A%E4%B9%89%E5%8F%8A%E5%85%B6%E8%BF%87%E7%A8%8B"><span class="toc-number">2.0.1.</span> <span class="toc-text">
          软件工程的定义及其过程</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%A8%A1%E5%9E%8B"><span class="toc-number">2.0.2.</span> <span class="toc-text">
          软件开发模型</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E8%A7%84%E6%A8%A1%E5%BA%A6%E9%87%8F"><span class="toc-number">2.0.3.</span> <span class="toc-text">
          软件规模度量</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%A8%8B%E5%BA%8F%E5%A4%8D%E6%9D%82%E6%80%A7%E5%BA%A6%E9%87%8F"><span class="toc-number">2.0.4.</span> <span class="toc-text">
          程序复杂性度量</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E5%8F%AF%E9%9D%A0%E6%80%A7%E5%BA%A6%E9%87%8F"><span class="toc-number">2.0.5.</span> <span class="toc-text">
          软件可靠性度量</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E7%BB%8F%E6%B5%8E%E5%AD%A6%E7%AE%80%E4%BB%8B"><span class="toc-number">3.</span> <span class="toc-text">
          软件工程经济学简介</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E7%BB%8F%E6%B5%8E%E5%AD%A6%E7%AE%80%E4%BB%8B-1"><span class="toc-number">3.1.</span> <span class="toc-text">
          软件工程经济学简介</span></a></li></ol></li></ol></section><!-- ov = overview--><section class="sidebar-ov hide"><div class="sidebar-ov-author"><div class="sidebar-ov-author__avatar"><img class="sidebar-ov-author__avatar_img" src="https://s4.ax1x.com/2022/01/03/Tb2VW6.png" alt="avatar"></div><p class="sidebar-ov-author__text">格物致知，知行合一</p></div><div class="sidebar-ov-social"><a class="sidebar-ov-social-item" href="https://s4.ax1x.com/2022/01/03/Tb8ZB4.png" target="_blank" rel="noopener" data-popover="微信" data-popover-pos="up"><span class="sidebar-ov-social-item__icon"><i class="fab fa-weixin"></i></span></a><a class="sidebar-ov-social-item" href="mailto:lklong@88.com" target="_blank" rel="noopener" data-popover="social.Email" data-popover-pos="up"><span class="sidebar-ov-social-item__icon">lklong@88.com</span></a></div><div class="sidebar-ov-cc"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en" target="_blank" rel="noopener" data-popover="知识共享许可协议" data-popover-pos="up"><img src="/images/cc-by-nc-sa.svg"></a></div></section><div class="sidebar-reading"><div class="sidebar-reading-info"><span class="sidebar-reading-info__text">你已阅读了 </span><span class="sidebar-reading-info__num">0</span><span class="sidebar-reading-info__perc">%</span></div><div class="sidebar-reading-line"></div></div></aside></div><div class="clearfix"></div></div></main><footer class="footer" id="footer"><div class="footer-inner"><div><span>Copyright © 2023</span><span class="footer__icon"><i class="fas fa-heart"></i></span><span>愷龍 All Rights Reserved</span></div><div><span>由 <a href="http://hexo.io/" title="Hexo" target="_blank" rel="noopener">Hexo</a> 强力驱动</span><span> v5.4.0</span><span class="footer__devider">|</span><span>主题 - <a href="https://github.com/liuyib/hexo-theme-stun/" title="Stun" target="_blank" rel="noopener">Stun</a></span><span> v2.6.2</span></div></div></footer><div class="loading-bar" id="loading-bar"><div class="loading-bar__progress"></div></div><div class="back2top" id="back2top"><span class="back2top__icon"><i class="fas fa-rocket"></i></span></div></div><div class="search-mask"></div><div class="search-popup"><span class="search-close"></span><div class="search-input"><input placeholder="搜索文章（支持多关键词，请用空格分隔）"></div><div class="search-results"></div></div><script src="https://cdn.jsdelivr.net/npm/jquery@v3.4.1/dist/jquery.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.2/velocity.ui.min.js"></script><script>function initSearch() {
  var isXML = true;
  var search_path = 'search.xml';

  if (!search_path) {
    search_path = 'search.xml';
  } else if (/json$/i.test(search_path)) {
    isXML = false;
  }

  var path = '/' + search_path;
  $.ajax({
    url: path,
    dataType: isXML ? 'xml' : 'json',
    async: true,
    success: function (res) {
      var datas = isXML ? $('entry', res).map(function () {
        // 将 XML 转为 JSON
        return {
          title: $('title', this).text(),
          content: $('content', this).text(),
          url: $('url', this).text()
        };
      }).get() : res;
      var $input = $('.search-input input');
      var $result = $('.search-results');
      // 搜索对象（标题、内容）的权重，影响显示顺序
      var WEIGHT = { title: 100, content: 1 };
      var searchPost = function () {
        var searchText = $input.val().toLowerCase().trim();
        // 根据空白字符分隔关键字
        var keywords = searchText.split(/[\s]+/);
        // 搜索结果
        var matchPosts = [];

        // 有多个关键字时，将原文字整个保存下来
        if (keywords.length > 1) {
          keywords.push(searchText);
        }
        // 防止未输入字符时搜索
        if (searchText.length > 0) {
          datas.forEach(function (data) {
            var isMatch  = false;
            // 没有标题的文章使用预设的 i18n 变量代替
            var title = (data.title && data.title.trim()) || '[ 文章无标题 ]';
            var titleLower = title && title.toLowerCase();
            // 删除 HTML 标签 和 所有空白字符
            var content = data.content && data.content.replace(/<[^>]+>/g, '');
            var contentLower = content && content.toLowerCase();
            // 删除重复的 /
            var postURL = data.url && decodeURI(data.url).replace(/\/{2,}/g, '/');
            // 标题中匹配到的关键词
            var titleHitSlice = [];
            // 内容中匹配到的关键词
            var contentHitSlice = [];

            keywords.forEach(function (keyword) {
              /**
              * 获取匹配的关键词的索引
              * @param {String} keyword 要匹配的关键字
              * @param {String} text 原文字
              * @param {Boolean} caseSensitive 是否区分大小写
              * @param {Number} weight 匹配对象的权重。权重大的优先显示
              * @return {Array}
              */
              function getIndexByword (word, text, caseSensitive, weight) {
                if (!word || !text) {
                  return [];
                };

                var startIndex = 0; // 每次匹配的开始索引
                var index = -1;     // 匹配到的索引值
                var result = [];    // 匹配结果

                if (!caseSensitive) {
                  word = word.toLowerCase();
                  text = text.toLowerCase();
                }

                while((index = text.indexOf(word, startIndex)) !== -1) {
                  var hasMatch = false;
                  // 索引位置相同的关键词，保留长度较长的
                  titleHitSlice.forEach(function (hit) {
                    if (hit.index === index && hit.word.length < word.length) {
                      hit.word = word;
                      hasMatch = true;
                    }
                  });
                  startIndex = index + word.length;
                  !hasMatch && result.push({ index: index, word: word, weight: weight });
                }
                return result;
              }
              titleHitSlice = titleHitSlice.concat(getIndexByword(keyword, titleLower, false, WEIGHT.title));
              contentHitSlice = contentHitSlice.concat(getIndexByword(keyword, contentLower, false, WEIGHT.content));
            });

            var hitTitle = titleHitSlice.length;
            var hitContent = contentHitSlice.length;

            if (hitTitle > 0 || hitContent > 0) {
              isMatch = true;
            }
            if (isMatch) {
              ;[titleHitSlice, contentHitSlice].forEach(function (hit) {
                // 按照匹配文字的索引的递增顺序排序
                hit.sort(function (left, right) {
                  return left.index - right.index;
                });
              });
              /**
              * 给文本中匹配到的关键词添加标记，从而进行高亮显示
              * @param {String} text 原文本
              * @param {Array} hitSlice 匹配项的索引信息
              * @param {Number} start 开始索引
              * @param {Number} end 结束索引
              * @return {String}
              */
              function highlightKeyword (text, hitSlice, start, end) {
                if (!text || !hitSlice || !hitSlice.length) {
                  return;
                }

                var result = '';
                var startIndex = start;
                var endIndex = end;
                hitSlice.forEach(function (hit) {
                  if (hit.index < startIndex) {
                    return;
                  }

                  var hitWordEnd = hit.index + hit.word.length;
                  result += text.slice(startIndex, hit.index);
                  result += '<b>' + text.slice(hit.index, hitWordEnd) + '</b>';
                  startIndex = hitWordEnd;
                });
                result += text.slice(startIndex, endIndex);
                return result;
              }

              var postData = {};
              // 文章总的搜索权重
              var postWeight = titleHitSlice.length * WEIGHT.title + contentHitSlice.length * WEIGHT.content;
              // 标记匹配关键词后的标题
              var postTitle = highlightKeyword(title, titleHitSlice, 0, title.length) || title;
              // 标记匹配关键词后的内容
              var postContent;
              // 显示内容的长度
              var SHOW_WORD_LENGTH = 200;
              // 命中关键词前的字符显示长度
              var SHOW_WORD_FRONT_LENGTH = 20;
              var SHOW_WORD_END_LENGTH = SHOW_WORD_LENGTH - SHOW_WORD_FRONT_LENGTH;

              // 截取匹配的第一个字符，前后共 200 个字符来显示
              if (contentHitSlice.length > 0) {
                var firstIndex = contentHitSlice[0].index;
                var start = firstIndex > SHOW_WORD_FRONT_LENGTH ? firstIndex - SHOW_WORD_FRONT_LENGTH : 0;
                var end = firstIndex + SHOW_WORD_END_LENGTH;
                postContent = highlightKeyword(content, contentHitSlice, start, end);
              } else { // 未匹配到内容，直接截取前 200 个字符来显示
                postContent = content.slice(0, SHOW_WORD_LENGTH);
              }
              postData.title = postTitle;
              postData.content = postContent;
              postData.url = postURL;
              postData.weight = postWeight;
              matchPosts.push(postData);
            }
          });
        }

        var resultInnerHtml = '';
        if (matchPosts.length) {
          // 按权重递增的顺序排序，使权重大的优先显示
          matchPosts.sort(function (left, right) {
            return right.weight - left.weight;
          });
          resultInnerHtml += '<ul>';
          matchPosts.forEach(function (post) {
            resultInnerHtml += '<li><a class="search-results-title" href="' + post.url + '">';
            resultInnerHtml += post.title;
            resultInnerHtml += '</a><div class="search-results-content">';
            resultInnerHtml += post.content;
            resultInnerHtml += '</div></li>';
          });
          resultInnerHtml += '</ul>';
        } else {
          resultInnerHtml += '<div class="search-results-none"><i class="far fa-meh"></i></div>';
        }
        $result.html(resultInnerHtml);
      };
      $input.on('input', searchPost);
      $input.on('keyup', function (e) {
        if (e.keyCode === Stun.utils.codeToKeyCode('Enter')) {
          searchPost();
        }
      });
    }
  });
}

function closeSearch () {
  $('body').css({ overflow: 'auto' });
  $('.search-popup').css({ display: 'none' });
  $('.search-mask').css({ display: 'none' });
}

window.addEventListener('DOMContentLoaded', function () {
  Stun.utils.pjaxReloadLocalSearch = function () {
    $('.header-nav-search').on('click', function (e) {
      e.stopPropagation();
      $('body').css('overflow', 'hidden');
      $('.search-popup')
        .velocity('stop')
        .velocity('transition.expandIn', {
          duration: 300,
          complete: function () {
            $('.search-popup input').focus();
          }
        });
      $('.search-mask')
        .velocity('stop')
        .velocity('transition.fadeIn', {
          duration: 300
        });

      initSearch();
    });
    $('.search-mask, .search-close').on('click', function () {
      closeSearch();
    });
    $(document).on('keydown', function (e) {
      // Escape <=> 27
      if (e.keyCode === Stun.utils.codeToKeyCode('Escape')) {
        closeSearch();
      }
    });
  };

  Stun.utils.pjaxReloadLocalSearch();
}, false);

function safeOpenUrl(url) {
  var newTab = window.open();
  newTab.opener = null;
  newTab.location = url;
}

function extSearch(engine) {
  var engines = {
    google: 'https://www.google.com/search?q=',
    bing: 'https://cn.bing.com/search?q=',
    baidu: 'https://www.baidu.com/s?ie=UTF-8&wd=',
  };
  var host = window.location.host;
  var query = $('.search-input input').val().toLowerCase().trim();
  var uri = engines[engine] + query + ' site:' + host;

  if (query) {
    safeOpenUrl(uri);
  } else {
    Stun.utils.popAlert('warning', '请输入字符');
  }
}

var assistSearchList = window.CONFIG.assistSearch;

if (Array.isArray(assistSearchList)) {
  assistSearchList.forEach(function (name) {
    document.querySelector('.search-btns-item--' + name).addEventListener('click', function () {
      extSearch(name);
    }, false);
  });
}</script><script src="https://cdn.jsdelivr.net/npm/leancloud-storage@latest/dist/av-min.js"></script><script src="https://cdn.jsdelivr.net/npm/valine@latest/dist/Valine.min.js"></script><script>function loadValine () {
  var GUEST_INFO = ['nick', 'mail', 'link'];
  var guest_info = 'nick,mail,link';

  guest_info = guest_info.split(',').filter(function(item) {
    return GUEST_INFO.indexOf(item) > -1;
  });
  new Valine({
    el: '#valine-container',
    appId: 'lxsmJYFBR3TcsTpKPFWSN0HX-gzGzoHsz',
    appKey: 'lW6taHRzBHFtJeWSSzXXMAxH',
    notify: true,
    verify: true,
    placeholder: 'Just go go',
    avatar: 'mp',
    meta: guest_info,
    pageSize: '10' || 10,
    visitor: false,
    recordIP: false,
    lang: '' || 'zh-cn',
    path: window.location.pathname
  });
}

if (false) {
  loadValine();
} else {
  window.addEventListener('DOMContentLoaded', loadValine, false);
}</script><script src="/js/utils.js?v=2.6.2"></script><script src="/js/stun-boot.js?v=2.6.2"></script><script src="/js/scroll.js?v=2.6.2"></script><script src="/js/header.js?v=2.6.2"></script><script src="/js/sidebar.js?v=2.6.2"></script><script type="application/json" src="/search.xml"></script></body></html>